package com.ethink.warehouse.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ethink.framework.common.constant.CommonRespCode;
import com.ethink.framework.common.db.PageUtils;
import com.ethink.framework.common.exception.BusinessException;
import com.ethink.framework.common.web.context.SPRequestContextHolder;
import com.ethink.warehouse.api.enums.MateInventoryOtherInLogOrderStatusEnum;
import com.ethink.warehouse.api.info.MateInventoryOtherInLogDetailInfo;
import com.ethink.warehouse.api.info.MateInventoryOtherInLogInfo;
import com.ethink.warehouse.api.info.MateInventoryOtherInLogModeInfo;
import com.ethink.warehouse.api.request.MateInventoryOtherInLogAddRequest;
import com.ethink.warehouse.api.request.MateInventoryOtherInLogQueryRequest;
import com.ethink.warehouse.api.request.MateInventoryOtherInLogUpdateRequest;
import com.ethink.warehouse.api.response.MateInventoryOtherInLogAddResponse;
import com.ethink.warehouse.api.response.MateInventoryOtherInLogDetailResponse;
import com.ethink.warehouse.api.response.MateInventoryOtherInLogUpdateResponse;
import com.ethink.warehouse.common.entity.MateInventoryOtherInLog;
import com.ethink.warehouse.common.mapper.MateInventoryOtherInLogMapper;
import com.ethink.warehouse.converter.MateInventoryOtherInLogConverter;
import com.ethink.warehouse.service.MateInventoryOtherInLogDetailService;
import com.ethink.warehouse.service.MateInventoryOtherInLogService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 其他入库 Service接口实现
 *
 * @author default
 * @date 2023-02-09
 */
@Slf4j
@Service
public class MateInventoryOtherInLogServiceImpl implements MateInventoryOtherInLogService {

    @Autowired
    private MateInventoryOtherInLogMapper mateInventoryOtherInLogMapper;

    @Autowired
    private MateInventoryOtherInLogConverter mateInventoryOtherInLogConverter;

    @Autowired
    private MateInventoryOtherInLogDetailService mateInventoryOtherInLogDetailService;

    @Override
    public Page<MateInventoryOtherInLogInfo> queryMateInventoryOtherInLog(MateInventoryOtherInLogQueryRequest request) {
        return mateInventoryOtherInLogMapper.queryMateInventoryOtherInLog(PageUtils.buildPage(request), request);
    }

    @Override
    public MateInventoryOtherInLogDetailResponse getMateInventoryOtherInLogById(Long mateInventoryOtherInLogId) {
        MateInventoryOtherInLogDetailResponse res = new MateInventoryOtherInLogDetailResponse();
        MateInventoryOtherInLogInfo main = mateInventoryOtherInLogMapper.getMateInventoryOtherInLogById(mateInventoryOtherInLogId);
        res.setMain(main);
        List<MateInventoryOtherInLogDetailInfo> items = mateInventoryOtherInLogDetailService.listMateInventoryOtherInLogDetailByOrderNo(main.getOrderNo());
        res.setItems(items);
        return res;
    }

    @Override
    public List<MateInventoryOtherInLogInfo> listMateInventoryOtherInLog(MateInventoryOtherInLogQueryRequest request) {
        return mateInventoryOtherInLogMapper.listMateInventoryOtherInLog(request);
    }

    @Override
    public MateInventoryOtherInLogAddResponse addMateInventoryOtherInLog(MateInventoryOtherInLogAddRequest request) {
        MateInventoryOtherInLogAddResponse response = new MateInventoryOtherInLogAddResponse();
        MateInventoryOtherInLog mateInventoryOtherInLog = new MateInventoryOtherInLog();
        BeanUtils.copyProperties(request, mateInventoryOtherInLog);
        // FIXME set默认字段
        mateInventoryOtherInLogMapper.insert(mateInventoryOtherInLog);
        response.setId(mateInventoryOtherInLog.getId());
        return response;
    }

    @Override
    public MateInventoryOtherInLogUpdateResponse updateMateInventoryOtherInLog(MateInventoryOtherInLogUpdateRequest request) {
        MateInventoryOtherInLogUpdateResponse response = new MateInventoryOtherInLogUpdateResponse();
        LambdaUpdateWrapper<MateInventoryOtherInLog> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(MateInventoryOtherInLog::getId, request.getId());
        // FIXME 按实际业务需求set
        updateWrapper.set(MateInventoryOtherInLog::getOrderNo, request.getOrderNo());
        updateWrapper.set(MateInventoryOtherInLog::getSubWarehouseCode, request.getSubWarehouseCode());
        updateWrapper.set(MateInventoryOtherInLog::getSaleSubChannel, request.getSaleSubChannel());
        updateWrapper.set(MateInventoryOtherInLog::getOrderStatus, request.getOrderStatus());
        updateWrapper.set(MateInventoryOtherInLog::getCreateUserCode, request.getCreateUserCode());
        updateWrapper.set(MateInventoryOtherInLog::getCreateUserName, request.getCreateUserName());
        updateWrapper.set(MateInventoryOtherInLog::getAuditUserCode, request.getAuditUserCode());
        updateWrapper.set(MateInventoryOtherInLog::getAuditUserName, request.getAuditUserName());
        mateInventoryOtherInLogMapper.update(null, updateWrapper);
        return response;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean deleteMateInventoryOtherInLog(Long mateInventoryOtherInLogId) {
        MateInventoryOtherInLogInfo mateInventoryOtherInLogInfo = mateInventoryOtherInLogMapper.getMateInventoryOtherInLogById(mateInventoryOtherInLogId);
        if (ObjectUtils.isEmpty(mateInventoryOtherInLogInfo)) {
            throw new BusinessException(CommonRespCode.SYSTEM_ERR, "此数据已被删除");
        }
        if (MateInventoryOtherInLogOrderStatusEnum.S3.eq(mateInventoryOtherInLogInfo.getOrderStatus())) {
            throw new BusinessException(CommonRespCode.SYSTEM_ERR, "当前订单不能删除");
        }
        LambdaUpdateWrapper<MateInventoryOtherInLog> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(MateInventoryOtherInLog::getId, mateInventoryOtherInLogId);
        updateWrapper.set(MateInventoryOtherInLog::getIsDeleted, Boolean.TRUE);
        int count = mateInventoryOtherInLogMapper.update(null, updateWrapper);
        // 修改明细逻辑删除字段
        Boolean flag = mateInventoryOtherInLogDetailService.deleteMateInventoryOtherInLogDetailByOrderNo(mateInventoryOtherInLogInfo.getOrderNo());
        if (!(count > 0 && flag)) {
            throw new BusinessException(CommonRespCode.SYSTEM_ERR, "删除失败");
        }
        return true;
    }

    /**
     * 根据id查实体
     *
     * @param mateInventoryOtherInLogId
     * @return
     */
    @Override
    public MateInventoryOtherInLog selectMateInventoryOtherInLogById(Long mateInventoryOtherInLogId) {
        return mateInventoryOtherInLogMapper.selectById(mateInventoryOtherInLogId);
    }

    /**
     * 审批通过
     *
     * @param mateInventoryOtherInLogId
     * @return
     */
    @Override
    public Boolean mateInventoryOtherInLogPass(Long mateInventoryOtherInLogId) {
        String currentUserCode = SPRequestContextHolder.getCurrentSystemUserLoginName();
        String currentUserName = SPRequestContextHolder.getCurrentSystemUserRealName();
        int count = mateInventoryOtherInLogMapper.update(null,
                Wrappers.<MateInventoryOtherInLog>lambdaUpdate().
                        eq(MateInventoryOtherInLog::getId, mateInventoryOtherInLogId)
                        .set(MateInventoryOtherInLog::getOrderStatus, MateInventoryOtherInLogOrderStatusEnum.S3.getIntValue())
                        .set(StringUtils.isNotEmpty(currentUserCode), MateInventoryOtherInLog::getAuditUserCode, currentUserCode)
                        .set(StringUtils.isNotEmpty(currentUserName), MateInventoryOtherInLog::getAuditUserName, currentUserName)
        );
        return count > 0;
    }

    /**
     * 审批拒绝
     *
     * @param mateInventoryOtherInLogId
     * @return
     */
    @Override
    public Boolean mateInventoryOtherInLogRefuse(Long mateInventoryOtherInLogId) {
        String currentUserCode = SPRequestContextHolder.getCurrentSystemUserLoginName();
        String currentUserName = SPRequestContextHolder.getCurrentSystemUserRealName();
        int count = mateInventoryOtherInLogMapper.update(null,
                Wrappers.<MateInventoryOtherInLog>lambdaUpdate().
                        eq(MateInventoryOtherInLog::getId, mateInventoryOtherInLogId)
                        .set(MateInventoryOtherInLog::getOrderStatus, MateInventoryOtherInLogOrderStatusEnum.S1.getIntValue())
                        .set(StringUtils.isNotEmpty(currentUserCode), MateInventoryOtherInLog::getAuditUserCode, currentUserCode)
                        .set(StringUtils.isNotEmpty(currentUserName), MateInventoryOtherInLog::getAuditUserName, currentUserName)
        );
        return count > 0;
    }

    /**
     * 货品模式查询
     *
     * @param request
     * @return
     */
    @Override
    public Page<MateInventoryOtherInLogModeInfo> queryMateInventoryOtherInLogMode(MateInventoryOtherInLogQueryRequest request) {
        return mateInventoryOtherInLogMapper.queryMateInventoryOtherInLogMode(PageUtils.buildPage(request), request);
    }
}
